home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume12 / ffccc / part09 < prev    next >
Encoding:
Text File  |  1990-05-14  |  47.2 KB  |  1,348 lines

  1. Newsgroups: comp.sources.misc
  2. organization: CERN, Geneva, Switzerland
  3. keywords: fortran
  4. subject: v12i095: Floppy - Fortran Coding Convention Checker Part 09/11
  5. from: julian@cernvax.cern.ch (julian bunn)
  6. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  7.  
  8. Posting-number: Volume 12, Issue 95
  9. Submitted-by: julian@cernvax.cern.ch (julian bunn)
  10. Archive-name: ffccc/part09
  11.  
  12. #!/bin/sh
  13. echo 'Start of Floppy, part 09 of 11:'
  14. echo 'x - CHKCHR.f'
  15. sed 's/^X//' > CHKCHR.f << '/'
  16. X      SUBROUTINE CHKCHR 
  17. XC Checks that incorrect relational operators
  18. XC are not used to compare   
  19. XC character strings in IF clauses.  
  20. XC INPUT ; current statement description 
  21. XC OUTPUT ; NFAULT   
  22. XC   
  23. X      include 'PARAM.h' 
  24. X      include 'ALCAZA.h' 
  25. X      include 'CLASS.h' 
  26. X      include 'FLAGS.h' 
  27. X      include 'CURSTA.h' 
  28. X      include 'STATE.h' 
  29. X      include 'USSTMT.h' 
  30. X      include 'USUNIT.h' 
  31. X      include 'USLTYD.h' 
  32. X      include 'USIGNO.h' 
  33. X      include 'CHECKS.h' 
  34. X      LOGICAL BTEST 
  35. X      IF(UNFLP) RETURN  
  36. X      IF(.NOT.LCHECK(42)) RETURN
  37. X      ICL1 = ICURCL(1)  
  38. X      IF(.NOT.LIFF(ICL1)) RETURN
  39. XC Find end of IF
  40. X      ILOC = INDEX(SSTA(:NCHST),'(')
  41. X      IF(ILOC.EQ.0)  RETURN 
  42. X      CALL SKIPLV(SSTA,ILOC+1,NCHST,.FALSE.,ILOCE,ILEV) 
  43. X      IF(ILOCE.EQ.0) RETURN 
  44. X      DO 40 I=1,NSNAME  
  45. XC Looping over variable names in the statement  
  46. X         IF(NSSTRT(I).GT.ILOCE) RETURN  
  47. XC Variable is inside IF clause  
  48. X         IF(.NOT.BTEST(NAMTYP(ISNAME+I),5))                      GOTO 40
  49. XC Character variable
  50. X         DO 10 IPOS=NSSTRT(I)-1,ILOC+1,-1   
  51. X            IF(SSTA(IPOS:IPOS).EQ.' ')                           GOTO 10
  52. X            IF(SSTA(IPOS:IPOS).EQ.'(')                           GOTO 20
  53. X            IF(SSTA(IPOS:IPOS).NE.'.')                           GOTO 20
  54. XC Check for incorrect relational operators  
  55. X            IF(SSTA(IPOS-3:IPOS).EQ.'.OR.')                      GOTO 20
  56. X            IF(SSTA(IPOS-3:IPOS).EQ.'.EQ.')                      GOTO 20
  57. X            IF(SSTA(IPOS-3:IPOS).EQ.'.NE.')                      GOTO 20
  58. X            IF(SSTA(IPOS-4:IPOS).EQ.'.AND.')                     GOTO 20
  59. X            IF(ILOCE-ILOC.GT.20) ILOCE=ILOC+20  
  60. X            WRITE(MZUNIT,500) SSTA(ILOC:ILOCE)  
  61. X            NFAULT = NFAULT + 1 
  62. X            RETURN  
  63. X   10    CONTINUE   
  64. X   20    ILEV = 0   
  65. X         DO 30 IPOS=NSEND(I)+1,ILOCE-1  
  66. X            IF(SSTA(IPOS:IPOS).EQ.' ')                           GOTO 30
  67. X            IF(SSTA(IPOS:IPOS).EQ.'(') ILEV=ILEV+1  
  68. X            IF(SSTA(IPOS:IPOS).EQ.')') ILEV=ILEV-1  
  69. X            IF(SSTA(IPOS:IPOS).EQ.')')                           GOTO 30
  70. X            IF(ILEV.NE.0)                                        GOTO 30
  71. X            IF(SSTA(IPOS:IPOS).NE.'.')                           GOTO 40
  72. X            IF(SSTA(IPOS:IPOS+3).EQ.'.OR.')                      GOTO 40
  73. X            IF(SSTA(IPOS:IPOS+3).EQ.'.EQ.')                      GOTO 40
  74. X            IF(SSTA(IPOS:IPOS+3).EQ.'.NE.')                      GOTO 40
  75. X            IF(SSTA(IPOS:IPOS+4).EQ.'.AND.')                     GOTO 40
  76. X            IF(ILOCE-ILOC.GT.20) ILOCE=ILOC+20  
  77. X            WRITE(MZUNIT,500) SSTA(ILOC:ILOCE)  
  78. X            NFAULT = NFAULT + 1 
  79. X            RETURN  
  80. X   30    CONTINUE   
  81. X   40 CONTINUE  
  82. X      RETURN
  83. X  500 FORMAT(1X,'!!! WARNING ... IF CLAUSE ',A,' USES', 
  84. X     +' INCORRECT RELATIONAL OPERATORS FOR CHARACTER TYPE') 
  85. X      END   
  86. /
  87. echo 'x - CSTATE.h'
  88. sed 's/^X//' > CSTATE.h << '/'
  89. X*IF DEF,NEVER   
  90. X*-----------------------------------------------------------------------
  91. X*      /STATE/    contains the information concerning the actual
  92. X*                 status of the program 
  93. X*      NLINES     no. of lines in line image buffer SIMA
  94. X*      NKEEPL     buffered line number in READEC, or 0  
  95. X*      NSTAMM     total no. of statements in current routine
  96. X*      NFSTAT     no. of FORTRAN statements in current routine  
  97. X*      ISNAME     pointer to start-1 of stmt. names in SNAMES   
  98. X*      NSNAME     no. of names found in statement   
  99. X*      IRNAME     pointer to start-1 of names/routine in SNAMES 
  100. X*      NRNAME     no. of names/routine  
  101. X*      IGNAME     pointer to start-1 of global names in SNAMES  
  102. X*      NGNAME     no. of global names   
  103. X*      INDCNT     current indentation level (reset at routine start)
  104. X*      INDFAC     no. of ch./level to indent
  105. X*      KNTDO      current DO loop level (for indentation)   
  106. X*      KNTIF      current IF...THEN level (for indentation) 
  107. X*      IBLPAD     in QUOTES option, string blank-padded to multiples
  108. X*                 of IBLPAD (default = 1)   
  109. X*      NRORST     no. of currently selected OR-sets in LRORST   
  110. X*      NSTANU     no. of statement numbers in KSTANU, KSTARE
  111. X*      ICBPRT     no. of c.b. variables printed at ACTION(24)   
  112. X*      NCBNAM     no. of c.b. names in NCBGRP, KCBGRP, SCBNAM   
  113. X*      NEQNAM     no. of equiv. groups in NEQGRP, KEQGRP
  114. X*      NCBVAR     no. of names in SEQNAM
  115. X*      NCBGRP     no. of common block variables per c.b.
  116. X*      KCBGRP     pos.-1 of start of c.b. name list in  SCBNAM  
  117. X*      LCBNAM     # of c.b. variables used in current routine   
  118. X*      LCBVAR     counts number of times a variable is referenced   
  119. X*      NEQGRP     no. of names in equiv. group  
  120. X*      KEQGRP     pos.-1 of start of equiv. group in SCBNAM 
  121. X*      LRORST     list of OR-sets valid for current routine 
  122. X*      NAMTYP     variable type, parallel to SNAMES 
  123. X*      NSSTRT     start of name I in SSTA   
  124. X*      NSEND      end of name I in SSTA 
  125. X*      KSTANU     statement numbers in routine (sorted) 
  126. X*      KSTARE     new statement numbers, corresponding to KSTANU
  127. X*      NLTYPE     type of line I (0 comment, 1 start, 2 cont. of stmt. )
  128. X*      ICLASS(I,1)  type of statement I 
  129. X*                   0 = comment 
  130. X*                   999 = no comment, not classified
  131. X*                   class = ICURCL(1), common /CURSTA/  
  132. X*      ICLASS(I,2)  type of second part of statement I if logical IF
  133. X*      IMODIF     10*n2 + n1
  134. X*                 n1 = 1 : statement has been filtered  
  135. X*                 n2 = 1 : statement has been modified  
  136. X*      NFLINE     start of statement I in SIMA  
  137. X*      NLLINE     end of statement I in SIMA
  138. X*-----------------------------------------------------------------------
  139. X*EI 
  140. /
  141. echo 'x - FLAGS.h'
  142. sed 's/^X//' > FLAGS.h << '/'
  143. X      COMMON/FLAGS/ACTION(MXFLAG),STATUS(MXFLAG)
  144. X      LOGICAL ACTION,STATUS 
  145. X*IF DEF,NEVER   
  146. X*-----------------------------------------------------------------------
  147. X* +++++++++++++++++++++++++ action flags - as listed
  148. X*  1      make namelist/routine 
  149. X*  2      make global namelist  
  150. X*  3      print illegal statements  
  151. X*  4      print changed statements  
  152. X*  5      print filtered statements 
  153. X*  6      print all statements  
  154. X*  7      write changed statements only on output file  
  155. X*  8      write filtered on output file 
  156. X*  9      write all on output file  
  157. X* 10      take first name only in statement 
  158. X* 11      convert hollerith to quotes   
  159. X* 12      string replacement requested  
  160. X* 13      resequence statement numbers  
  161. X* 14      FORMAT to end of routine  
  162. X* 15      name replacements requested   
  163. X* 16      routine filters given 
  164. X* 17      class filters given   
  165. X* 18      name filters given
  166. X* 19      string filters given  
  167. X* 20      type variables
  168. X* 21      indent
  169. X* 22      USER command given
  170. X* 23      compressed output file requested  
  171. X* 24      COMMON block option (signal unused and used C.B.) 
  172. X* 25      print namelist / routine  
  173. X* 26      print global namelist 
  174. X* 27      print COMMON block and variable usage 
  175. X* 28      adjust GOTO to the right  
  176. X* 29      write tree output file on unit 13 
  177. X* +++++++++++++++++++++++++ status flags - as listed
  178. X*  1      no more lines on input
  179. X*  2      no more lines to process  
  180. X*  3      illegal stmnt. detected in EXTRAC (unclosed string, or
  181. X*         illegal character '{', '}'  ).
  182. X*  4      end of program due to time limit  
  183. X*  5      currently buffered routine without end (split)
  184. X*  6      currently buffered routine continuation (split)   
  185. X*  7      current routine filtered  
  186. X*  8      last filter passed
  187. X*  9      routine header still to be printed
  188. X* 10      statement still to be printed 
  189. X* 11      statement cannot be changed (length overflow,or illegal repl.)
  190. X* 12      c.b. name list overflow in PROCOM, discard current routine
  191. X* 13      true when equiv. groups and commons have been merged (PROCOM) 
  192. X* 14      true when current routine is a SUBROUTINE 
  193. X*-----------------------------------------------------------------------
  194. X*EI 
  195. /
  196. echo 'x - GETCON.f'
  197. sed 's/^X//' > GETCON.f << '/'
  198. X      SUBROUTINE GETCON(STRING,I1,I2,KLCH,STYP) 
  199. X*-----------------------------------------------------------------------
  200. X*   
  201. X*--- returns a numeric constant, and its type. Constant must start on I1
  202. X*--- input  
  203. X*    STRING(I1:I2)  string  
  204. X*--- output 
  205. X*    KLCH           last pos. of const., or 0 if none   
  206. X*    STYP           type of constant:   
  207. X*                  'I' = integer
  208. X*                  'R' = real   
  209. X*                  'D' = double prec.   
  210. X*                  'K' = complex
  211. X*                  '$' = not specified  
  212. X*   
  213. X*-----------------------------------------------------------------------
  214. X      CHARACTER *(*)  STRING
  215. X      CHARACTER*1 STYP,STEMP,SLAST,SLOG*7   
  216. X      include 'CONVEX.h' 
  217. X      STYP='$'  
  218. X      KLCH=0
  219. X      STEMP=STRING(I1:I1)   
  220. X      IF(STEMP.EQ.'{')  THEN
  221. X*--- string, hollerith, etc., all treated as CHARACTER  
  222. X         KPOS=INDEX(STRING(I1:I2),'}')  
  223. X         IF(KPOS.NE.0) THEN 
  224. X            KLCH=I1+KPOS-1  
  225. X            STYP='C'
  226. X         ENDIF  
  227. X      ELSEIF(STEMP.EQ.'.')  THEN
  228. X*--- logical constant ? 
  229. X         CALL GETNBL(STRING(I1:I2),SLOG,NN) 
  230. X         IF(NN.GE.5) THEN   
  231. X            IF(SLOG(:5).EQ.'.NOT.'.OR.SLOG(:6).EQ.'.TRUE.'  
  232. X     +      .OR.SLOG.EQ.'.FALSE.') THEN 
  233. X               CALL POSCH('.',STRING,I1+1,I2,.FALSE.,0,KLCH,ILEV)   
  234. X               IF(KLCH.NE.0) THEN   
  235. X                  STYP='L'  
  236. X                  GOTO 999  
  237. X               ENDIF
  238. X            ENDIF   
  239. X         ENDIF  
  240. X      ENDIF 
  241. X      IF(NUMCH(STEMP).OR.STEMP.EQ.'.')  THEN
  242. X*--- integer, real, or double precision 
  243. X         KLCH=I1
  244. X         IF(STEMP.EQ.'.')  THEN 
  245. X            STYP='R'
  246. X         ELSE   
  247. X            STYP='I'
  248. X         ENDIF  
  249. X         SLAST=STEMP
  250. X         DO 10 I=I1+1,I2
  251. X            STEMP=STRING(I:I)   
  252. X            IF(STEMP.EQ.' ') GOTO 10
  253. X            IF(.NOT.NUMCH(STEMP)) THEN  
  254. X               IF(STEMP.EQ.'.'.OR.STEMP.EQ.'E') THEN
  255. X                  STYP='R'  
  256. X               ELSEIF(STEMP.EQ.'D') THEN
  257. X                  STYP='D'  
  258. X               ELSEIF((STEMP.EQ.'+'.OR.STEMP.EQ.'-').AND. (SLAST.EQ.'E' 
  259. X     +         .OR.SLAST.EQ.'D')) THEN  
  260. X                  CONTINUE  
  261. X               ELSE 
  262. X                  GOTO 20   
  263. X               ENDIF
  264. X            ENDIF   
  265. X            KLCH=I  
  266. X            SLAST=STEMP 
  267. X   10    CONTINUE   
  268. X   20    CONTINUE   
  269. X      ELSEIF(STEMP.EQ.'(')  THEN
  270. X*--- complex
  271. X         CALL SKIPLV(STRING,I1+1,I2,.FALSE.,KLCH,ILEV)  
  272. X         IF(KLCH.GT.0) THEN 
  273. X            CALL POSCH(',',STRING,I1+1,KLCH-1,.FALSE.,0,KPOS,ILEV)  
  274. X            IF(KPOS.NE.0) STYP='K'  
  275. X         ENDIF  
  276. X      ENDIF 
  277. X  999 END   
  278. /
  279. echo 'x - INDECZ.f'
  280. sed 's/^X//' > INDECZ.f << '/'
  281. X      SUBROUTINE INDECZ(ISTR1,ISTR2)
  282. X*-----------------------------------------------------------------------
  283. X*   
  284. X*  Checks consistency between replacement strings, kills illegal ones   
  285. X*   
  286. X*--- Input  
  287. X*    ISTR1        ref. to string to be replaced (rel. to KKYSTA, KKYEND)
  288. X*    ISTR2        ref. to replacing string  
  289. X*-----------------------------------------------------------------------
  290. X      include 'PARAM.h' 
  291. X      include 'ALCAZA.h' 
  292. X      include 'KEYCOM.h' 
  293. X      include 'FLWORK.h' 
  294. X      include 'CONDEC.h' 
  295. X      DIMENSION ICT1(10),ICT2(10),IREF1(MXNAME/20,10), IREF2(MXNAME/20, 
  296. X     +10)   
  297. X      EQUIVALENCE (IREF1(1,1),IWS(1)),(IREF2(1,1),IWS(MXNAME/2+1))  
  298. X      CHARACTER *40 STEXT(4)
  299. X      DATA STEXT/'too many special symbols', 'unclosed [...] in string',
  300. X     +'replacement count [n] too high', 
  301. X     +'unclosed quote string inside string'/
  302. X    
  303. X      include 'CONDAT.h' 
  304. X      IF(ISTR1.GT.0.AND.ISTR2.GT.0)  THEN   
  305. X*--- extract special symbols from first string  
  306. X         CALL SPECCT(1,ISTR1,NTOT1,ICT1,IREF1,IERR) 
  307. X         IF (IERR.NE.0) GOTO 30 
  308. X*--- second string  
  309. X         CALL SPECCT(2,ISTR2,NTOT2,ICT2,IREF2,IERR) 
  310. X         IF (IERR.NE.0) GOTO 30 
  311. X         IF (NTOT2.GT.0)  THEN  
  312. X*--- there are special symbols in the replacement string -  
  313. X*    check that no count in [...] higher than actually present  
  314. X            DO 20 I=1,LEN(SPCHAR)   
  315. X               DO 10 J=1,ICT2(I)
  316. X                  IF (ICT1(I).LT.IREF2(J,I))  THEN  
  317. X                     IERR=3 
  318. X                     GOTO 30
  319. X                  ENDIF 
  320. X   10          CONTINUE 
  321. X   20       CONTINUE
  322. X         ENDIF  
  323. X      ENDIF 
  324. X      GOTO 999  
  325. X   30 CONTINUE  
  326. X*--- error condition - suppress string (or name+string) replacement 
  327. X      WRITE (MPUNIT,10000) STEXT(IERR)  
  328. X      I1=KKYSTA(ISTR1)-1
  329. X      I2=KKYEND(ISTR1)  
  330. X      L=(I2-I1-1)/MXLINE+1  
  331. X      DO 40 I=1,L   
  332. X         SIMA(I)=SKYSTR(I1+1:MIN(I2,I1+MXLINE)) 
  333. X         I1=I1+MXLINE   
  334. X   40 CONTINUE  
  335. X      CALL FLPRNT(0,'replace',L,SIMA,I1)
  336. X      I1=KKYSTA(ISTR2)-1
  337. X      I2=KKYEND(ISTR2)  
  338. X      L=(I2-I1-1)/MXLINE+1  
  339. X      DO 50 I=1,L   
  340. X         SIMA(I)=SKYSTR(I1+1:MIN(I2,I1+MXLINE)) 
  341. X         I1=I1+MXLINE   
  342. X   50 CONTINUE  
  343. X      CALL FLPRNT(0,'by string',L,SIMA,I1)  
  344. X      ISTR1=-IERR   
  345. X10000 FORMAT(/' +++++++ WARNING - ',A,' in following replacement ', 
  346. X     +'request, request ignored')   
  347. X  999 END   
  348. /
  349. echo 'x - PARAM.h'
  350. sed 's/^X//' > PARAM.h << '/'
  351. X      PARAMETER(MXNAME=20000,MXSSTM=600,MXSTAT=71,MCLASS=22,MXLENG=1320,
  352. X     1  MXLINE=80,MXSIMA=2000,MXSIMD=MXSIMA+500,MCUNIT=7,MPUNIT=6,  
  353. X     2  MIUNIT=11,MTUNIT=13,MOUNIT=14,MXFLAG=30,MXNMCH=8,MXORST=20, 
  354. X     3  MDIMST=2000,MGLOKY=9,MLOCKY=4,MSUBKY=24,MTOTKY=MGLOKY+MLOCKY,   
  355. X     4  MXKEYS=MGLOKY+MXORST*MLOCKY,MXKINT=100,MXKNAM=500,MXTYPE=20,
  356. X     5  MAXNUM=1000,MAXGRP=100,TIMLIM=1.,   
  357. X     +  VERSIO=6.00,
  358. X     6  KALL=100,KENT=20,NOARG=50)  
  359. X*IF DEF,NEVER   
  360. X*-----------------------------------------------------------------------
  361. X*--- MXNAME = dimension of IWS, COMMON/FLWORK/, and of SNAMES /ALCAZA/  
  362. X*    MXSSTM = length of string SSTM, COMMON/ALCAZA/ 
  363. X*    MXSTAT = max. no. of statement definitions 
  364. X*    MCLASS = first dim. of ISTMDS( , ) = no. of control words/statement
  365. X*    MXLENG = max. length of statement field (20*66)
  366. X*    MXLINE = line length of input image
  367. X*    MXSIMA = max. no. of lines in input image (one routine)
  368. X*    MXSIMD = dim. of SIMA (excess for replacement overflows)   
  369. X*    MCUNIT = file for command input (data cards)   
  370. X*    MPUNIT = file for printed output   
  371. X*    MIUNIT = FORTRAN code input unit   
  372. X*    MTUNIT = TREE output unit  
  373. X*    MOUNIT = FORTRAN code output unit  
  374. X*    MXFLAG = no. of status and action flags
  375. X*    MXNMCH = max. no. of characters per name   
  376. X*    MXORST = max. no. of OR-sets in control commands   
  377. X*    MDIMST = dimension of SSTA, SSTR, SKYSTR   
  378. X*    MGLOKY = no. of global command keys
  379. X*    MLOCKY = no. of local (in each OR-set) command keys
  380. X*    MSUBKY = no. of command sub-keys   
  381. X*    MXKINT = dim. of KEYINT  /KEYINP/  
  382. X*    MXKNAM = max. no. of names or strings on input commands (total)
  383. X*    MXTYPE = max. no. of variable types
  384. X*    MAXNUM = max. no. of statement numbers per routine 
  385. X*    MAXGRP = max. no. of c.b. names or equiv. groups (for ACTION(24))  
  386. X*    TIMLIM = if less time left, refrain from reading next routine  
  387. X*    VERSIO = program version   
  388. X*    KALL   = max. no. of different externals / routine (TREE)  
  389. X*    KENT   = max. no. of ENTRY statements / routine    (TREE)  
  390. X*    NOARG  = max. no. of arguments / call              (TREE)  
  391. X*-----------------------------------------------------------------------
  392. X*EI 
  393. /
  394. echo 'x - PRNAMF.f'
  395. sed 's/^X//' > PRNAMF.f << '/'
  396. X      SUBROUTINE PRNAMF(ICC1,ICC2)  
  397. X*-----------------------------------------------------------------------
  398. X*   
  399. X*   Prints name table with all attributes (types)   
  400. X*   
  401. X*   Input   
  402. X*   ICC1           first name is SNAMES to be printed   
  403. X*   ICC2           last             -          -
  404. X*   
  405. X*   NAMTYP    , common /STATE/  
  406. X*   
  407. X*   Each type corresponds to a bit position (for testing use ITBIT).
  408. X*   
  409. X*   Types are:  
  410. X*   
  411. X*   Bit          meaning
  412. X*   
  413. X*     1          INTEGER
  414. X*     2          REAL   
  415. X*     3          LOGICAL
  416. X*     4          COMPLEX
  417. X*     5          DOUBLE PRECISION   
  418. X*     6          CHARACTER  
  419. X*     7          PARAMETER  
  420. X*     8          COMMON block name  
  421. X*     9          NAMELIST name  
  422. X*    10          statement function 
  423. X*    11          INTRINSIC  
  424. X*    12          EXTERNAL   
  425. X*    13          PROGRAM name   
  426. X*    14          BLOCK DATA name
  427. X*    15          SUBROUTINE 
  428. X*    16          ENTRY  
  429. X*    17          FUNCTION (intrinsic or external)   
  430. X*    18          dimensioned
  431. X*    19          (routine or function) argument 
  432. X*    20          in a COMMON block  
  433. X*    21          strongly typed function (internal usage)   
  434. X*   
  435. X*-----------------------------------------------------------------------
  436. X      include 'PARAM.h' 
  437. X      include 'ALCAZA.h' 
  438. X      include 'STATE.h' 
  439. X      CHARACTER SLINE*120, STYP(MXTYPE)*18  
  440. X      DIMENSION LTYP(MXTYPE)
  441. X      DATA STYP/'INTEGER','REAL','LOGICAL','COMPLEX','DOUBLE PRECISION',
  442. X     +'CHARACTER','PARAMETER','COMMON block','NAMELIST',
  443. X     +'statement function','INTRINSIC','EXTERNAL','PROGRAM',
  444. X     +'BLOCK DATA','SUBROUTINE','ENTRY','FUNCTION', 'array','argument', 
  445. X     +'in COMMON'/  
  446. X      DATA LTYP/7,4,7,7,16,9,9,12,8,18,9,8,7,10,10,5,8,5,8,9/   
  447. X      IP=0  
  448. X      SLINE=' ' 
  449. X      DO 20 I=ICC1,ICC2 
  450. X         SLINE(IP+1:IP+MXNMCH)=SNAMES(I)
  451. X         IPT=IP+MXNMCH+3
  452. X         NT=NAMTYP(I)   
  453. X         DO 10 J=1,MXTYPE   
  454. X            IF (MOD(NT,2).NE.0)  THEN   
  455. X               L=LTYP(J)
  456. X               IF (IPT+L.LE.IP+60)  THEN
  457. X                  SLINE(IPT+1:IPT+L)=STYP(J)(:L)
  458. X                  IPT=IPT+L+2   
  459. X               ENDIF
  460. X            ENDIF   
  461. X            NT=NT/2 
  462. X   10    CONTINUE   
  463. X         IF (IP.EQ.0)  THEN 
  464. X            IP=60   
  465. X         ELSE   
  466. X            IP=0
  467. X            WRITE (MPUNIT,'(1X,A120)') SLINE
  468. X            SLINE=' '   
  469. X         ENDIF  
  470. X   20 CONTINUE  
  471. X      IF(IP.NE.0)  THEN 
  472. X         WRITE (MPUNIT,'(1X,A120)') SLINE   
  473. X      ENDIF 
  474. X      END   
  475. /
  476. echo 'x - PRTCOM.f'
  477. sed 's/^X//' > PRTCOM.f << '/'
  478. X      SUBROUTINE PRTCOM 
  479. X*-----------------------------------------------------------------------
  480. X*   
  481. X*   Prints common block usage and variables referenced  
  482. X*   as prepared by routine PROCOM (option COMMON).  
  483. X*   
  484. X*-----------------------------------------------------------------------
  485. X      include 'PARAM.h' 
  486. X      include 'ALCAZA.h' 
  487. X      include 'STATE.h' 
  488. X      CHARACTER*(MXNMCH) SLOC(5)
  489. X      DIMENSION ILOC(5) 
  490. X      IF(NCBNAM.GT.0)  THEN 
  491. X         NUSE=0 
  492. X         DO 10 I=1,NCBNAM   
  493. X            IF(LCBNAM(I).GT.0) NUSE=NUSE+1  
  494. X   10    CONTINUE   
  495. X         WRITE(MPUNIT,10000) SCROUT,NCBNAM,NUSE 
  496. X         WRITE(MPUNIT,10010) (SCBNAM(I),LCBNAM(I),I=1,NCBNAM)   
  497. X         IF(ICBPRT.GT.0) THEN   
  498. X            WRITE(MPUNIT,10020) ICBPRT  
  499. X            DO 40 I=1,NCBNAM
  500. X               N=0  
  501. X               NT=0 
  502. X               K=KCBGRP(I)  
  503. X               DO 20 J=1,NCBGRP(I)  
  504. X                  IF(LCBVAR(K+J).NE.0) THEN 
  505. X                     N=N+1  
  506. X                     NT=NT+1
  507. X                     SLOC(N)=SCBVAR(K+J)
  508. X                     ILOC(N)=LCBVAR(K+J)
  509. X                     IF(NT.EQ.ICBPRT) GOTO 30   
  510. X                     IF(N.EQ.5) THEN
  511. X                        IF(NT.LE.5) THEN
  512. X                           WRITE(MPUNIT,10030) SCBNAM(I),(SLOC(M),ILOC  
  513. X     +                     (M),M=1,N)   
  514. X                        ELSE
  515. X                           WRITE(MPUNIT,10040) (SLOC(M),ILOC(M),M=1,N)  
  516. X                        ENDIF   
  517. X                        N=0 
  518. X                     ENDIF  
  519. X                  ENDIF 
  520. X   20          CONTINUE 
  521. X   30          CONTINUE 
  522. X               IF(N.GT.0) THEN  
  523. X                  IF(NT.LE.5) THEN  
  524. X                     WRITE(MPUNIT,10030) SCBNAM(I),(SLOC(M),ILOC(M),M=1,
  525. X     +               N) 
  526. X                  ELSE  
  527. X                     WRITE(MPUNIT,10040) (SLOC(M),ILOC(M),M=1,N)
  528. X                  ENDIF 
  529. X               ENDIF
  530. X   40       CONTINUE
  531. X         ENDIF  
  532. X      ENDIF 
  533. X10000 FORMAT(/' +++ routine ',A8,' has ',I5,' common blocks ',  
  534. X     +'of which ',I5,' are used')   
  535. X10010 FORMAT('    c.b. name + no. of var. used  ',T45, A8,I4,3X,A8,I4, 3
  536. X     +X,A8,I4,3X,A8,I4,3X,A8,I4/ (T45,A8,I4,3X,A8,I4,3X,A8,I4,3X,A8,I4,3
  537. X     +X,A8,I4)) 
  538. X10020 FORMAT(/'     list of first ',I5,' common variables in each ',
  539. X     +'block + number of references'/)  
  540. X10030 FORMAT('  /',A8,'/',T20,5(A8,I4,3X))  
  541. X10040 FORMAT(T20,5(A8,I4,3X))   
  542. X      END   
  543. /
  544. echo 'x - PUTOPT.f'
  545. sed 's/^X//' > PUTOPT.f << '/'
  546. X      SUBROUTINE PUTOPT(SOPT,LOPT,ICHR,IERR)
  547. XC! Put an operator on the stack 
  548. X      include 'STACK.h' 
  549. X      CHARACTER*(*) SOPT
  550. X      include 'OPPREC.h' 
  551. XC   
  552. XC Here we use the operator precedence for Fortran to determine  
  553. XC whether the addition of this operator will cause the stack
  554. XC to be reduced. Note both right and left precedence is needed. 
  555. XC Thanks to Julian Blake for this info. 
  556. XC   
  557. X      IERR = 0  
  558. X      DO 10 I=1,LOPS
  559. X         IF(ILENO(I).NE.LOPT)                                 GOTO 10   
  560. X         IF(SOPT(:LOPT).EQ.COPER(I)(:LOPT))                      GOTO 20
  561. X   10 CONTINUE  
  562. X      IERR = 1  
  563. XC not found ... not an operator 
  564. X                                                                 GOTO 30
  565. X   20 CONTINUE  
  566. XC found. Operator number I  
  567. X      IOP = I   
  568. X      IPREC = IRITP(IOP)
  569. XC   
  570. XC     WRITE(6,100) NLEVL,(CTYP(I),COPD(I)(:LOPD(I)),COPT(I),
  571. XC    &             IPOP(I),IPOS(I), 
  572. XC    &             I=NLEVL,1,-1)
  573. XC   
  574. XC     WRITE(6,110) SOPT(:LOPT),IPREC
  575. XC   
  576. XC check if operator already present 
  577. X      IF(COPT(NLEVL)(:1).NE.' ') THEN   
  578. X         NLEVL = NLEVL + 1  
  579. X         CTYP(NLEVL) = '$'  
  580. X         COPD(NLEVL)(:LCOPD) = ' '  
  581. X         LOPD(NLEVL) = 0
  582. X         COPT(NLEVL)(:LOPER) = ' '  
  583. X         COPT(NLEVL)(:LOPT) = SOPT(:LOPT)   
  584. X         IPOP(NLEVL) = ILEFP(IOP)   
  585. X         IPOS(NLEVL) = ICHR 
  586. X         IERR = 0   
  587. X                                                                 GOTO 30
  588. X      ENDIF 
  589. XC place operator on stack   
  590. X      COPT(NLEVL)(:LOPER) = ' ' 
  591. X      COPT(NLEVL)(:LOPT) = SOPT(:LOPT)  
  592. X      IPOP(NLEVL) = ILEFP(IOP)  
  593. X      IPOS(NLEVL) = ICHR
  594. XC check for reduction of stack  
  595. X      IF(NLEVL.EQ.1) THEN   
  596. X         IERR = 0   
  597. X                                                                 GOTO 30
  598. X      ENDIF 
  599. X      IF(IRITP(IOP).GT.IPOP(NLEVL-1)) THEN  
  600. X         IERR = 0   
  601. X                                                                 GOTO 30
  602. X      ENDIF 
  603. XC expression must be reduced
  604. X      CALL REDEXP(IOP,IERR) 
  605. X      IERR = -IERR  
  606. X   30 CONTINUE  
  607. X      RETURN
  608. X  500 FORMAT(///,1X,'IN PUTOPT ... STACK LEVEL = ',I2, /,1X,
  609. X     +'TYPE,OPERAND',23X,',OPERATOR,PRECEDENCE,POSITION', /,1X, 
  610. X     +'---- -------',23('-'),' -------- ---------- --------', (/,1X,2X, 
  611. X     +A1,2X,A30,8X,A2,6X,I2,8X,I2)) 
  612. X  510 FORMAT(1X,'CURRENT OPERATOR -> ',A,' PRECEDENCE = ',I2)   
  613. X      END   
  614. /
  615. echo 'x - QUOSUB.f'
  616. sed 's/^X//' > QUOSUB.f << '/'
  617. X      SUBROUTINE QUOSUB 
  618. X*-----------------------------------------------------------------------
  619. X*   
  620. X*   Removes {} = string indicators, changes " or ...H to ' if ACTION(11)
  621. X*   
  622. X*-----------------------------------------------------------------------
  623. X      include 'PARAM.h' 
  624. X      include 'ALCAZA.h' 
  625. X      include 'FLAGS.h' 
  626. X      include 'CURSTA.h' 
  627. X      include 'STATE.h' 
  628. X      include 'JOBSUM.h' 
  629. X      CHARACTER *1 STEMP
  630. X      NMOD=IMODIF(NSTREF)   
  631. X      NCH=0 
  632. X      IPT=0 
  633. X   10 CONTINUE  
  634. X      IF (IPT.EQ.NCHST) GOTO 30 
  635. X      IN=INDEX(SSTA(IPT+1:NCHST),'{')   
  636. X      IF (IN.EQ.0) GOTO 30  
  637. X      L=IN-1
  638. X      IN=IPT+IN 
  639. X      IF(L.GT.0)  THEN  
  640. X         IF (NCH+L.GT.MXLENG) GOTO 40   
  641. X         SSTR(NCH+1:NCH+L)=SSTA(IPT+1:IPT+L)
  642. X         NCH=NCH+L  
  643. X      ENDIF 
  644. X      IPT=IN
  645. X      IN=INDEX(SSTA(IPT+1:NCHST),'}')   
  646. X      L=IN-1
  647. X      IN=IPT+IN 
  648. X      STEMP=SSTA(IPT+1:IPT+1)   
  649. X      IF(STEMP.EQ.''''.OR..NOT.ACTION(11))  THEN
  650. X         IF (NCH+L.GT.MXLENG) GOTO 40   
  651. X         SSTR(NCH+1:NCH+L)=SSTA(IPT+1:IN-1) 
  652. X         NCH=NCH+L  
  653. X      ELSE  
  654. X*--- replace " or ...H, double up single quotes 
  655. X         IF (NMOD.LT.10) NMOD=NMOD+10   
  656. X         IF (STEMP.EQ.'"')  THEN
  657. X            I1=IPT+2
  658. X            I2=IN-2 
  659. X         ELSE   
  660. X*--- find H 
  661. X            I1=IPT+INDEX(SSTA(IPT+1:NCHST),'H')+1   
  662. X            I2=IN-1 
  663. X         ENDIF  
  664. X         NCH=NCH+1  
  665. X         IF (NCH.GT.MXLENG) GOTO 40 
  666. X         SSTR(NCH:NCH)='''' 
  667. X         DO 20 I=I1,I2  
  668. X            NCH=NCH+1   
  669. X            IF (NCH.GT.MXLENG) GOTO 40  
  670. X            STEMP=SSTA(I:I) 
  671. X            SSTR(NCH:NCH)=STEMP 
  672. X            IF (STEMP.EQ.'''')  THEN
  673. X               NCH=NCH+1
  674. X               IF (NCH.GT.MXLENG) GOTO 40   
  675. X               SSTR(NCH:NCH)=STEMP  
  676. X            ENDIF   
  677. X   20    CONTINUE   
  678. X         IF (IBLPAD.GT.1)  THEN 
  679. X*--- blank pad string up to multiple of IBLPAD  
  680. X            KPAD=MOD(I2+1-I1,IBLPAD)
  681. X            IF (KPAD.GT.0)  THEN
  682. X               I=IBLPAD-KPAD
  683. X               IF (NCH+I.GT.MXLENG) GOTO 40 
  684. X               SSTR(NCH+1:NCH+I)=' '
  685. X               NCH=NCH+I
  686. X            ENDIF   
  687. X         ENDIF  
  688. X         NCH=NCH+1  
  689. X         IF (NCH.GT.MXLENG) GOTO 40 
  690. X         SSTR(NCH:NCH)='''' 
  691. X      ENDIF 
  692. X      IPT=IN
  693. X      GOTO 10   
  694. X   30 CONTINUE  
  695. X*--- transfer rest and swap if modified 
  696. X      IF (IPT.EQ.0) GOTO 999
  697. X      L=NCHST-IPT+1 
  698. X      IF(L.GT.0)  THEN  
  699. X         IF (NCH+L.GT.MXLENG) GOTO 40   
  700. X         SSTR(NCH+1:NCH+L)=SSTA(IPT+1:NCHST)
  701. X         NCH=NCH+L  
  702. X      ENDIF 
  703. X      IMODIF(NSTREF)=NMOD   
  704. X      SSTA(:NCH)=SSTR(:NCH) 
  705. X      NCHST=NCH 
  706. X      GOTO 999  
  707. X   40 CONTINUE  
  708. X*--- error exit - statement too long
  709. X      WRITE (MPUNIT,10000)  
  710. X      CALL FLPRNT(1,'OVERFLOW',NLLINE(NSTREF)-NFLINE(NSTREF)+1, SIMA
  711. X     +(NFLINE(NSTREF)),NDUMMY)  
  712. X      NSTATC(6)=NSTATC(6)+1 
  713. X      STATUS(11)=.TRUE. 
  714. X10000 FORMAT(/' ++++++ Warning - replacements would lead to overflow',  
  715. X     +' in following statement, not done')  
  716. X  999 END   
  717. /
  718. echo 'x - REDEXP.f'
  719. sed 's/^X//' > REDEXP.f << '/'
  720. X      SUBROUTINE REDEXP(IOP,IERR)   
  721. XC! Reduce the expression on the stack   
  722. X      include 'PARAM.h' 
  723. X      include 'CURSTA.h' 
  724. X      include 'STACK.h' 
  725. X      include 'ALCAZA.h' 
  726. X      include 'USUNIT.h' 
  727. X      CHARACTER*(MDIMST) CTEMP  
  728. X      CHARACTER*(LCOPD) SNEW
  729. X      CHARACTER*1 SNUTY 
  730. X      include 'OPPREC.h' 
  731. XC   
  732. XC     WRITE(6,100)  
  733. XC  100 FORMAT(//,1X,'Now reduce the expression on the stack')   
  734. XC   
  735. X      IERR = 0  
  736. X    5 CONTINUE  
  737. X      IF(NLEVL.LE.1) THEN   
  738. X        IERR = 1
  739. X        GOTO 900
  740. X      ENDIF 
  741. XC   
  742. X       L1 = MAX(1,LOPD(NLEVL-1))
  743. X       L2 = MAX(1,INDEX(COPT(NLEVL-1),' ' )-1)  
  744. X       L3 = MAX(1,LOPD(NLEVL))  
  745. X       L = L1+L2+L3 
  746. XC The exepression to be reduced is SNEW 
  747. X       SNEW(:L)=COPD(NLEVL-1)(:L1)//COPT(NLEVL-1)(:L2)//COPD(NLEVL)(:L3)
  748. XC   
  749. XC check for generic intrinsic function  
  750. XC if so, then assign the type of the expression in parentheses  
  751. XC to the function   
  752. XC   
  753. X       IF(CTYP(NLEVL-1).EQ.'$'.AND.COPT(NLEVL-1)(:1).EQ.'(') THEN   
  754. X         CTYP(NLEVL-1) = CTYP(NLEVL)
  755. X       ENDIF
  756. XC   
  757. XC check for mixed mode operation
  758. XC   
  759. X       CALL OPRSLT(CTYP(NLEVL-1),COPT(NLEVL-1),CTYP(NLEVL), 
  760. X     &             IERR,SNUTY)  
  761. X       IF(IERR.EQ.1) THEN   
  762. X         DO 10 ICH=1,NCHST  
  763. X           CTEMP(ICH:ICH) = ' ' 
  764. X           IF(ICH.EQ.IPOS(NLEVL-1)) CTEMP(ICH:ICH) = '^'
  765. X   10    CONTINUE   
  766. XC        WRITE(6,110) SSTA(1:NCHST),CTEMP(:NCHST)   
  767. X         IFINT=MIN(NCHST,100)   
  768. X         WRITE(MZUNIT,110) SSTA(1:IFINT),CTEMP(1:IFINT) 
  769. X  110    FORMAT(1X,'!!! MIXED MODE EXPRESSION (BAD OPERATOR IS MARKED)',
  770. X     &   /,1X,A,/,1X,A) 
  771. X         GOTO 900   
  772. X       ENDIF
  773. XC   
  774. XC treat matching parantheses specially  
  775. XC   
  776. X       IF(COPT(NLEVL-1).EQ.'('.AND.COPER(IOP).EQ.')') THEN  
  777. X         IF(L1.EQ.0) THEN   
  778. X           SNUTY = CTYP(NLEVL)  
  779. X         ELSE   
  780. X           SNUTY = CTYP(NLEVL-1)
  781. X         ENDIF  
  782. X         SNEW(:L+1) = SNEW(:L)//')' 
  783. X         L = L+1
  784. X         NLEVL = NLEVL - 1  
  785. X         CTYP(NLEVL) = SNUTY
  786. X         COPD(NLEVL) = SNEW 
  787. X         LOPD(NLEVL) = L
  788. X         COPT(NLEVL) = ' '  
  789. X         IPOP(NLEVL) = 0
  790. X         IPOS(NLEVL) = 0
  791. X         GOTO 900   
  792. X       ENDIF
  793. XC   
  794. X       NLEVL = NLEVL-1  
  795. X       CTYP(NLEVL) = SNUTY  
  796. X       COPD(NLEVL) = SNEW   
  797. X       LOPD(NLEVL) = L  
  798. X       COPT(NLEVL) = COPER(IOP) 
  799. X       IPOP(NLEVL) = ILEFP(IOP) 
  800. X       IPOS(NLEVL) = 0  
  801. XC   
  802. X       IF(IRITP(IOP).GT.IPOP(NLEVL-1)) THEN 
  803. X         GOTO 900   
  804. X       ENDIF
  805. XC   
  806. XC continue reduction
  807. XC   
  808. X      GOTO 5
  809. X  900 CONTINUE  
  810. X      RETURN
  811. X      END   
  812. /
  813. echo 'x - REPSTR.f'
  814. sed 's/^X//' > REPSTR.f << '/'
  815. X      SUBROUTINE REPSTR 
  816. X*-----------------------------------------------------------------------
  817. X*   
  818. X*   Performs string replacements
  819. X*   
  820. X*-----------------------------------------------------------------------
  821. X      include 'PARAM.h' 
  822. X      include 'ALCAZA.h' 
  823. X      include 'FLAGS.h' 
  824. X      include 'CURSTA.h' 
  825. X      include 'STATE.h' 
  826. X      include 'KEYCOM.h' 
  827. X      include 'JOBSUM.h' 
  828. X      DIMENSION KSP1(100),KSP2(100) 
  829. X      CHARACTER*1 STEMP 
  830. X      NMOD=IMODIF(NSTREF)   
  831. X*--- check for 'REP' key
  832. X      DO 10 IK=1,NGLSET 
  833. X         IF (KEYREF(IK,1).EQ.9) GOTO 20 
  834. X   10 CONTINUE  
  835. X      GOTO 999  
  836. X   20 CONTINUE  
  837. X*--- check for string replacement   
  838. X      IF (KEYREF(IK,6).EQ.0) GOTO 999   
  839. X      DO 50 I=KEYREF(IK,7)+1,KEYREF(IK,7)+KEYREF(IK,6)  
  840. X         NCH=0  
  841. X         IPT=0  
  842. X         KREF1=KSTREF(I,1)  
  843. X         KREF2=KSTREF(I,2)  
  844. X*--- check illegal  
  845. X         IF (KREF1.LE.0) GOTO 50
  846. X         K1=KKYSTA(KREF1)   
  847. X         K2=KKYEND(KREF1)   
  848. X         IF (SKYSTR(K1:K1).NE.'#')  THEN
  849. X*--- insert '#' for free match  
  850. X            KST=1   
  851. X            K1=K1-1 
  852. X            STEMP=SKYSTR(K1:K1) 
  853. X            SKYSTR(K1:K1)='#'   
  854. X         ELSE   
  855. X            KST=0   
  856. X         ENDIF  
  857. X   30    CONTINUE   
  858. X         CALL MATCH(SKYSTR,K1,K2,SSTA,IPT+1,NCHST,.TRUE.,KPOS,ILEV,NSPEC
  859. X     +   ,KSP1,KSP2)
  860. X         IF (KPOS.EQ.0) GOTO 40 
  861. X*--- string does match  
  862. X*--- set modify flag
  863. X         IF (NMOD.LT.10) NMOD=NMOD+10   
  864. X*--- transfer additional '#' if there   
  865. X         IF (KST.NE.0)  THEN
  866. X            L=KSP2(1)-IPT   
  867. X            IF (L.GT.0)  THEN   
  868. X               SSTR(NCH+1:NCH+L)=SSTA(IPT+1:IPT+L)  
  869. X               NCH=NCH+L
  870. X            ENDIF   
  871. X         ENDIF  
  872. X         IPT=KPOS   
  873. X         IF (KREF2.GT.0)  THEN  
  874. X*--- non-empty replacement string exists
  875. X            CALL REPSUB(KREF1,KREF2,NSPEC-KST,KSP1(KST+1),KSP2(KST+1),  
  876. X     +      NCH)
  877. X            IF (NCH.GT.MXLENG) GOTO 60  
  878. X         ENDIF  
  879. X         IF (IPT.LT.NCHST) GOTO 30  
  880. X   40    CONTINUE   
  881. X         IF (KST.NE.0) SKYSTR(K1:K1)=STEMP  
  882. X         IF (IPT.NE.0)  THEN
  883. X*--- copy SSTR to SSTA, NCH to NCHST
  884. X            L=NCHST-IPT 
  885. X            IF (L.GT.0)  THEN   
  886. X               IF (NCH+L.GT.MXLENG) GOTO 60 
  887. X               SSTR(NCH+1:NCH+L)=SSTA(IPT+1:NCHST)  
  888. X               NCH=NCH+L
  889. X            ENDIF   
  890. X            NCHST=NCH   
  891. X            SSTA(:NCH)=SSTR(:NCH)   
  892. X         ENDIF  
  893. X   50 CONTINUE  
  894. X      IMODIF(NSTREF)=NMOD   
  895. X      GOTO 999  
  896. X   60 CONTINUE  
  897. X      WRITE (MPUNIT,10000)  
  898. X      CALL FLPRNT(1,'OVERFLOW',NLLINE(NSTREF)-NFLINE(NSTREF)+1, SIMA
  899. X     +(NFLINE(NSTREF)),NDUMMY)  
  900. X      NSTATC(6)=NSTATC(6)+1 
  901. X      STATUS(11)=.TRUE. 
  902. X10000 FORMAT(/' ++++++ Warning - replacements would lead to overflow',  
  903. X     +' in following statement, not done')  
  904. X  999 END   
  905. /
  906. echo 'x - SETIMP.f'
  907. sed 's/^X//' > SETIMP.f << '/'
  908. X      SUBROUTINE SETIMP 
  909. X*-----------------------------------------------------------------------
  910. X*   
  911. X*   Sets the default type list for an IMPLICIT statement, updates the   
  912. X*   already existing routine names  (except for strongly typed).
  913. X*   
  914. X*-----------------------------------------------------------------------
  915. X      include 'PARAM.h' 
  916. X      include 'ALCAZA.h' 
  917. X      include 'CONDEC.h' 
  918. X      include 'FLWORK.h' 
  919. X      include 'CURSTA.h' 
  920. X      include 'TYPDEF.h' 
  921. X      CHARACTER STYP(6)*16,STEMP*1,SPREV*1,STEMP2*2 
  922. X      DIMENSION LTYP(6) 
  923. X      DATA STYP/'#INTEGER','#REAL','#LOGICAL','#COMPLEX',   
  924. X     +'#DOUBLEPRECISION','#CHARACTER'/  
  925. X      DATA LTYP/8,5,8,8,16,10/  
  926. X      include 'CONDAT.h' 
  927. X      IPT=0 
  928. X   10 CONTINUE  
  929. X      IND=NCHST 
  930. X      DO 20 I=1,6   
  931. X         CALL MATCH(STYP(I),1,LTYP(I),SSTA,IPT+1,NCHST,.FALSE.,IPOS,ILEV
  932. X     +   ,NSPEC,IWS,IWS)
  933. X         IF (IPOS.GT.0.AND.IPOS.LE.IND)  THEN   
  934. X            IND=IPOS
  935. X            IT=I
  936. X         ENDIF  
  937. X   20 CONTINUE  
  938. X      IF (IND+3.GT.NCHST) GOTO 999  
  939. X      IPT=IND   
  940. X*--- skip possible '*(...)' following the key   
  941. X      CALL GETNBL(SSTA(IPT+1:NCHST),STEMP2,NN)  
  942. X      IF (NN.LT.2) GOTO 999 
  943. X      IF(STEMP2.EQ.'*(')  THEN  
  944. X         IPT=IPT+INDEX(SSTA(IPT+1:NCHST),'(')   
  945. X         CALL SKIPLV(SSTA,IPT+1,NCHST,.FALSE.,IPOS,ILEV)
  946. X         IF (IPOS.EQ.0) GOTO 999
  947. X         IPT=IPOS   
  948. X      ENDIF 
  949. X*--- get start and end of bracket following type
  950. X      IND=INDEX(SSTA(IPT+1:NCHST),'(')  
  951. X      IF (IND.EQ.0) GOTO 999
  952. X      IPT=IPT+IND   
  953. X      CALL SKIPLV(SSTA,IPT+1,NCHST,.FALSE.,IPOS,ILEV)   
  954. X      IF (IPOS.EQ.0) GOTO 999   
  955. X*--- loop over bracket, set type, reset types routine name table
  956. X      SPREV=' ' 
  957. X      KP=27 
  958. X      DO 40 I=IPT+1,IPOS-1  
  959. X         STEMP=SSTA(I:I)
  960. X         IF (STEMP.EQ.' ') GOTO 40  
  961. X         K=ICVAL(STEMP) 
  962. X         IF (K.GT.0.AND.K.LE.26)  THEN  
  963. X            IF (SPREV.EQ.'-')  THEN 
  964. X               DO 30 J=KP,K 
  965. X                  KVTYPE(J)=IT  
  966. X   30          CONTINUE 
  967. X            ELSE
  968. X               KVTYPE(K)=IT 
  969. X            ENDIF   
  970. X            KP=K
  971. X         ENDIF  
  972. X         SPREV=STEMP
  973. X   40 CONTINUE  
  974. X      IPT=IPOS  
  975. X      GOTO 10   
  976. X  999 END   
  977. /
  978. echo 'x - SKIPTP.f'
  979. sed 's/^X//' > SKIPTP.f << '/'
  980. X      SUBROUTINE SKIPTP(ITYPE,STRING,ICC1,ICC2,HOLFLG,KPOS,ILEV)
  981. X*-----------------------------------------------------------------------
  982. X* positions on the last character of a string of the requested type 
  983. X* input 
  984. X* ITYPE      1 = numeric
  985. X*            2 = alpha  
  986. X*            3 = alpha-numeric  
  987. X*            4 = special
  988. X*            5 = FORTRAN-name   
  989. X*            6 = expression ( no [,] at level 0 )   
  990. X* STRING     string 
  991. X* ICC1       first ch, in string
  992. X* ICC2       last   -    -  -   
  993. X* HOLFLG     if TRUE, hollerith included
  994. X* output
  995. X* KPOS       position of last ch. of given type, if ICC1 is of that 
  996. X*            type, otherwise = 0
  997. X* ILEV       level (including KPOS) relative to input level 0   
  998. X*-----------------------------------------------------------------------
  999. X      LOGICAL HOLFLG
  1000. X      CHARACTER STRING*(*),STEMP*1  
  1001. X      include 'CONVEX.h' 
  1002. X      ILEV=0
  1003. X      KPOS=0
  1004. X      NCNT=0
  1005. X      ISSTR=0   
  1006. X      ILBASE=-1 
  1007. X      JC=ICC1-1 
  1008. X   10 JC=JC+1   
  1009. X      IF (JC.GT.ICC2) GOTO 999  
  1010. X      STEMP=STRING(JC:JC)   
  1011. X*--- skip blanks outside strings
  1012. X      IF (STEMP.EQ.' '.AND.ISSTR.EQ.0) GOTO 10  
  1013. X      IF(STEMP.EQ.'{')  THEN
  1014. X*--- start of character string  
  1015. X         ISSTR=1
  1016. X         IF (.NOT.HOLFLG) THEN  
  1017. X            ISSTR=0 
  1018. X            I=INDEX(STRING(JC:ICC2),'}')
  1019. X            IF (I.EQ.0) GOTO 999
  1020. X            JC=I+JC-2   
  1021. X         ENDIF  
  1022. X         GOTO 10
  1023. X      ELSEIF(STEMP.EQ.'}')  THEN
  1024. X         ISSTR=0
  1025. X         IF(ITYPE.EQ.6)  THEN   
  1026. X            KPOS=JC 
  1027. X         ELSE   
  1028. X            GOTO 10 
  1029. X         ENDIF  
  1030. X      ELSEIF(ITYPE.EQ.1)  THEN  
  1031. X         IF (NUMCH(STEMP)) KPOS=JC  
  1032. X      ELSEIF(ITYPE.EQ.2)  THEN  
  1033. X         IF (ALPHCH(STEMP)) KPOS=JC 
  1034. X      ELSEIF(ITYPE.EQ.3)  THEN  
  1035. X         IF (ANUMCH(STEMP)) KPOS=JC 
  1036. X      ELSEIF(ITYPE.EQ.4)  THEN  
  1037. X         IF (SPECCH(STEMP))  THEN   
  1038. X            KPOS=JC 
  1039. X            IF (STEMP.EQ.'(')  THEN 
  1040. X               ILEV=ILEV+1  
  1041. X            ELSEIF (STEMP.EQ.')')  THEN 
  1042. X               ILEV=ILEV-1  
  1043. X            ENDIF   
  1044. X         ENDIF  
  1045. X      ELSEIF(ITYPE.EQ.5)  THEN  
  1046. X         IF (NCNT.EQ.0)  THEN   
  1047. X            IF (ALPHCH(STEMP))  THEN
  1048. X               KPOS=JC  
  1049. X               NCNT=NCNT+1  
  1050. X            ENDIF   
  1051. X         ELSEIF (ANUMCH(STEMP))  THEN   
  1052. X            KPOS=JC 
  1053. X         ENDIF  
  1054. X      ELSEIF(ITYPE.EQ.6)  THEN  
  1055. X         IF (KPOS.EQ.0.AND..NOT.(ANUMCH(STEMP).OR.STEMP.EQ.'('.OR.STEMP.
  1056. X     +   EQ.'+'.OR.STEMP.EQ.'-'.OR.STEMP.EQ.''''))GOTO 999  
  1057. X         IF (STEMP.EQ.'(')  THEN
  1058. X            ILEV=ILEV+1 
  1059. X         ELSEIF (ILBASE.LT.0)  THEN 
  1060. X            ILBASE=ILEV 
  1061. X         ENDIF  
  1062. X         IF (STEMP.EQ.')')  ILEV=ILEV-1 
  1063. X         IF ((STEMP.NE.','.OR.ILEV-ILBASE.GT.0).AND.ILEV.GE.0) KPOS=JC  
  1064. X      ENDIF 
  1065. X      IF (KPOS.EQ.JC) GOTO 10   
  1066. X  999 END   
  1067. /
  1068. echo 'x - SPECCT.f'
  1069. sed 's/^X//' > SPECCT.f << '/'
  1070. X      SUBROUTINE SPECCT(MODE,ISTR,NTOT,ICT,IREF,IERR)   
  1071. X*-----------------------------------------------------------------------
  1072. X*  Extracts information on special characters from strings  
  1073. X*  Input
  1074. X*  MODE     = 1 : treat a string which is to be replaced
  1075. X*           = 2 : treat a replacement string
  1076. X*  ISTR     = string ref. (relative to KKYSTA, KKYEND)  
  1077. X*  Output   
  1078. X*  NTOT     = total no. of special characters   
  1079. X*  ICT (I)   = count for character I (in SPCHAR)
  1080. X*  IREF(J,I)= if MODE = 1 : 
  1081. X*             for the Jth character I, total count  
  1082. X*             if MODE = 2 : 
  1083. X*             for the Jth character I, count in [...]   
  1084. X*   
  1085. X*--- important: special characters inside '...' not counted !   
  1086. X*   
  1087. X*  IERR     = 0 : all OK
  1088. X*           = 1 : buffer overflow   
  1089. X*           = 2 : unclosed [...]
  1090. X*           = 3 : number in [...] out of range  
  1091. X*           = 4 : unclosed '...' inside string  
  1092. X*-----------------------------------------------------------------------
  1093. X      include 'PARAM.h' 
  1094. X      include 'KEYCOM.h' 
  1095. X      DIMENSION ICT(*),IREF(MXNAME/20,*)
  1096. X      include 'CONVEX.h' 
  1097. X      IERR=0
  1098. X      NTOT=0
  1099. X      INSTR=0   
  1100. X      DO 10 I=1,7   
  1101. X         ICT(I)=0   
  1102. X   10 CONTINUE  
  1103. X      J=KKYSTA(ISTR)-1  
  1104. X      KEND=KKYEND(ISTR) 
  1105. X   20 CONTINUE  
  1106. X      J=J+1 
  1107. X      IF (J.GT.KEND) GOTO 30
  1108. X      IF(SKYSTR(J:J).EQ.'''')  INSTR=1-INSTR
  1109. X      IF (INSTR.NE.0) GOTO 20   
  1110. X      I=INDEX(SPCHAR,SKYSTR(J:J))   
  1111. X      IF(I.EQ.7)  THEN  
  1112. X*--- '>' found, look for ')' to follow  
  1113. X         IF (J.EQ.KEND)  THEN   
  1114. X            I=0 
  1115. X         ELSEIF (SKYSTR(J+1:J+1).EQ.')')  THEN  
  1116. X            J=J+1   
  1117. X         ELSE   
  1118. X            I=0 
  1119. X         ENDIF  
  1120. X      ENDIF 
  1121. X      IF(I.GT.0)  THEN  
  1122. X*--- check buffer size  
  1123. X         IF (ICT(I).EQ.MXNAME/2)  THEN  
  1124. X            IERR=1  
  1125. X            GOTO 999
  1126. X         ENDIF  
  1127. X         NTOT=NTOT+1
  1128. X         ICT(I)=ICT(I)+1
  1129. X         IF (MODE.EQ.1)  THEN   
  1130. X            IREF(ICT(I),I)=NTOT 
  1131. X         ELSEIF (J.LT.KEND.AND.SKYSTR(J+1:J+1).EQ.'[')  THEN
  1132. X            J=J+1   
  1133. X            IF (J.EQ.KEND)  THEN
  1134. X               IERR=2   
  1135. X               GOTO 999 
  1136. X            ELSEIF (SKYSTR(J+1:J+1).EQ.']')  THEN   
  1137. X               IREF(ICT(I),I)=ICT(I)
  1138. X            ELSE
  1139. X*--- get integer in [...]   
  1140. X               CALL GETINT(SKYSTR,J+1,KEND,KFCH,KLCH,NN)
  1141. X               IF (KFCH.EQ.0.OR.NN.EQ.0)  THEN  
  1142. X                  IERR=3
  1143. X                  GOTO 999  
  1144. X               ELSE 
  1145. X                  IREF(ICT(I),I)=NN 
  1146. X                  IF (KLCH.EQ.KEND)  THEN   
  1147. X                     IERR=2 
  1148. X                     GOTO 999   
  1149. X                  ENDIF 
  1150. X                  J=KLCH+1  
  1151. X                  IF (SKYSTR(J:J).NE.']')  THEN 
  1152. X                     IERR=2 
  1153. X                     GOTO 999   
  1154. X                  ENDIF 
  1155. X               ENDIF
  1156. X            ENDIF   
  1157. X         ELSE   
  1158. X            IREF(ICT(I),I)=ICT(I)   
  1159. X         ENDIF  
  1160. X      ENDIF 
  1161. X      GOTO 20   
  1162. X   30 CONTINUE  
  1163. X      IF(INSTR.NE.0)  IERR=4
  1164. X  999 END   
  1165. /
  1166. echo 'x - STSUMM.f'
  1167. sed 's/^X//' > STSUMM.f << '/'
  1168. X      SUBROUTINE STSUMM 
  1169. X*-----------------------------------------------------------------------
  1170. X*   
  1171. X*--- Prints statement count summary 
  1172. X*   
  1173. X*-----------------------------------------------------------------------
  1174. X      include 'PARAM.h' 
  1175. X      include 'ALCAZA.h' 
  1176. X      include 'FLWORK.h' 
  1177. X      include 'JOBSUM.h' 
  1178. X      include 'CLASS.h' 
  1179. X      DIMENSION IREF(3,MXSTAT),IOUT(4,2)
  1180. X      EQUIVALENCE (IREF(1,1),IWS(1))
  1181. X      DO 10 I=1,NCLASS  
  1182. X         DO 10 J=1,3
  1183. X   10 IREF(J,I)=0   
  1184. X*--- collect references to external classes 
  1185. X      DO 20 I=1,NCLASS  
  1186. X         K=ISTMDS(6,I)  
  1187. X         IREF(1,K)=I
  1188. X         IREF(2,K)=IREF(2,K)+NFDCLS(I,1)
  1189. X         IREF(3,K)=IREF(3,K)+NFDCLS(I,2)
  1190. X   20 CONTINUE  
  1191. X      WRITE (MPUNIT,10000)  
  1192. X      N=0   
  1193. X      DO 30 I=1,NCLASS  
  1194. X         K=IREF(1,I)
  1195. X         IF (K.NE.0)  THEN  
  1196. X            N=N+1   
  1197. X            IOUT(1,N)=I 
  1198. X            IOUT(2,N)=IREF(2,I) 
  1199. X            IOUT(3,N)=IREF(3,I) 
  1200. X            IOUT(4,N)=K 
  1201. X            IF (N.EQ.2)  THEN   
  1202. X               N=0  
  1203. X               WRITE (MPUNIT,10010) IOUT(1,1),SNAM(ISTMDS(1,IOUT(4,1)): 
  1204. X     +         ISTMDS(2,IOUT(4,1))),IOUT(2,1),IOUT(3,1),IOUT(1,2),SNAM( 
  1205. X     +         ISTMDS(1,IOUT(4,2)):ISTMDS(2,IOUT(4,2))),IOUT(2,2),IOUT  
  1206. X     +         ( 3,2)   
  1207. X            ENDIF   
  1208. X         ENDIF  
  1209. X   30 CONTINUE  
  1210. X      IF(N.GT.0)  THEN  
  1211. X         WRITE (MPUNIT,10010) IOUT(1,1),SNAM(ISTMDS(1,IOUT(4,1)):ISTMDS(
  1212. X     +   2,IOUT(4,1))),IOUT(2,1),IOUT(3,1)  
  1213. X      ENDIF 
  1214. X10000 FORMAT('1',10('----'),' Summary for filtered statements ', 10(
  1215. X     +'----')// 
  1216. X     +' Except for ILLEGAL (all occurrences in filtered routines),',
  1217. X     +' only filtered statements counted.'/ 
  1218. X     +' There are two types of counts, 1 = overall occurence, ',
  1219. X     +'2 = behind logical IF'// ' number',15X,'name',T41,   
  1220. X     +' count-1 count-2', T61,' number',15X,'name',T101,
  1221. X     +' count-1 count-2'/)  
  1222. X10010 FORMAT(1X,I6,4X,A29,2I8,T61,1X,I6,4X,A29,2I8) 
  1223. X      END   
  1224. /
  1225. echo 'x - USLTYP.f'
  1226. sed 's/^X//' > USLTYP.f << '/'
  1227. X      LOGICAL FUNCTION LMODUL(I)
  1228. X      LMODUL = I.EQ.3.OR.I.EQ.9.OR.I.EQ.12.OR.I.EQ.21.OR.I.EQ.  
  1229. X     &         26.OR.I.EQ.33.OR.I.EQ.41.OR.I.EQ.47.OR.I.EQ. 
  1230. X     &         56.OR.I.EQ.60.OR.I.EQ.67 
  1231. X      END   
  1232. X      LOGICAL FUNCTION LFUNCT(I)
  1233. X      LFUNCT = I.EQ.9.OR.I.EQ.12.OR.I.EQ.21.OR.I.EQ.33.OR.I.EQ.41.  
  1234. X     &         OR.I.EQ.47.OR.I.EQ.60
  1235. X      END   
  1236. X      LOGICAL FUNCTION LNSVT(I) 
  1237. X      LNSVT  = I.EQ.10.OR.I.EQ.42.OR.I.EQ.48.OR.I.EQ.61 
  1238. X      END   
  1239. X      LOGICAL FUNCTION LCOMMN(I)
  1240. X      LCOMMN = I.EQ.8   
  1241. X      END   
  1242. X      LOGICAL FUNCTION LDIMEN(I)
  1243. X      LDIMEN = I.EQ.10.OR.I.EQ.11.OR.I.EQ.13.OR.I.EQ.14.OR.I.EQ.17. 
  1244. X     &         OR.I.EQ.42.OR.I.EQ.43.OR.I.EQ.48.OR.I.EQ.49.OR.I.EQ. 
  1245. X     &         61.OR.I.EQ.62.OR.I.EQ.22 
  1246. X      END   
  1247. X      LOGICAL FUNCTION LELSE(I) 
  1248. X      LELSE = I.EQ.30.OR.I.EQ.29
  1249. X      END   
  1250. X      LOGICAL FUNCTION LGOTO(I) 
  1251. X      LGOTO  = I.GE.34.AND.I.LE.36  
  1252. X      END   
  1253. X      LOGICAL FUNCTION LPRINT(I)
  1254. X      LPRINT = I.EQ.53  
  1255. X      END   
  1256. X      LOGICAL FUNCTION LIFF(I)  
  1257. X      LIFF   = I.GE.37.AND.I.LE.39.OR.I.EQ.30   
  1258. X      END   
  1259. X      LOGICAL FUNCTION LWRITE(I)
  1260. X      LWRITE = I.EQ.68  
  1261. X      END   
  1262. X      LOGICAL FUNCTION LPAUSE(I)
  1263. X      LPAUSE = I.EQ.55  
  1264. X      END   
  1265. X      LOGICAL FUNCTION LSAVE(I) 
  1266. X      LSAVE = I.EQ.65   
  1267. X      END   
  1268. X      LOGICAL FUNCTION LSTOP(I) 
  1269. X      LSTOP = I.EQ.66   
  1270. X      END   
  1271. X      LOGICAL FUNCTION LENTRY(I)
  1272. X      LENTRY = I.EQ.26  
  1273. X      END   
  1274. X      LOGICAL FUNCTION LIO(I)   
  1275. X      LIO    = I.EQ.4.OR.I.EQ.5.OR.I.EQ.15.OR.I.EQ.25.OR.I.EQ.52.   
  1276. X     &         OR.I.EQ.53.OR.I.EQ.57.OR.I.EQ.58.OR.I.EQ.59.OR.I.
  1277. X     &         EQ.64.OR.I.EQ.68 
  1278. X      END   
  1279. X      LOGICAL FUNCTION LRETRN(I)
  1280. X      LRETRN = I.EQ.63  
  1281. X      END   
  1282. X      LOGICAL FUNCTION LMODUS(I)
  1283. X      LMODUS = I.EQ.3.OR.I.EQ.9.OR.I.EQ.12.OR.I.EQ.21.  
  1284. X     &         OR.I.EQ.33.OR.I.EQ.41.OR.I.EQ.47.OR.I.EQ.56.OR.  
  1285. X     &         I.EQ.60.OR.I.EQ.67   
  1286. X      END   
  1287. X      LOGICAL FUNCTION LCHARC(I)
  1288. X      LCHARC = I.EQ.13.OR.I.EQ.14   
  1289. X      END   
  1290. X      LOGICAL FUNCTION LDECLR(I)
  1291. X      LOGICAL LDIMEN
  1292. X      LDECLR = LDIMEN(I).OR.I.EQ.8.OR.I.EQ.27.OR.I.EQ.28.OR.I.EQ.   
  1293. X     &         44.OR.I.EQ.46.OR.I.EQ.51.OR.I.EQ.54.OR.I.EQ.65   
  1294. X      END   
  1295. X      LOGICAL FUNCTION LDATA(I) 
  1296. X      LDATA  = I.EQ.16  
  1297. X      END   
  1298. X      LOGICAL FUNCTION LASIGN(I)
  1299. X      LASIGN = I.GE.69.AND.I.LE.71  
  1300. X      END   
  1301. /
  1302. echo 'x - copyright'
  1303. sed 's/^X//' > copyright << '/'
  1304. X************************************************************************
  1305. X*                                                                      *
  1306. X*                           CERN                                       *
  1307. X*                                                                      *
  1308. X*     EUROPEAN ORGANIZATION FOR PARTICLE PHYSICS                       *
  1309. X*                                                                      *
  1310. X*     Program name: FLOPPY : Fortran Coding Convention Checker         *
  1311. X*                            and source tidier                         *
  1312. X*                                                                      *
  1313. X*     Authors              : J.J.Bunn and H. Grote                     *
  1314. X*                            CERN                                      *
  1315. X*                            CH-1211 GENEVA 23                         *
  1316. X*                            SWITZERLAND                               *
  1317. X*                            JULIAN at CERNVM.CERN.CH                  *
  1318. X*                            VXCERN::JULIAN (DECNET) node 22.37        *
  1319. X*                                                                      *
  1320. X*     Copyright  CERN,  Geneva  1990  -  Copyright  and  any   other   *
  1321. X*     appropriate  legal  protection  of this computer program and     *
  1322. X*     associated documentation reserved  in  all  countries  of  the   *
  1323. X*     world.                                                           *
  1324. X*                                                                      *
  1325. X*     CERN undertakes no obligation  for  the  maintenance  of  this   *
  1326. X*     program  or  package,  nor responsibility for its correctness,   *
  1327. X*     and accepts no liability whatsoever resulting from the use  of   *
  1328. X*     it.                                                              *
  1329. X*                                                                      *
  1330. X*     Programs and documentation are provided solely for the use  of   *
  1331. X*     the organization to which they are distributed.                  *
  1332. X*     The program may be obtained from CERN subject to CERN            *
  1333. X*     distribution rules.                                              *
  1334. X*                                                                      *
  1335. X*     This program  may  not  be  copied  or  otherwise  distributed   *
  1336. X*     without  permission. This message must be retained on this and   *
  1337. X*     any other authorized copies.                                     *
  1338. X*                                                                      *
  1339. X*     The material cannot be sold. CERN should be  given  credit  in   *
  1340. X*     all references.                                                  *
  1341. X*                                                                      *
  1342. X************************************************************************
  1343. /
  1344. echo 'Part 09 of Floppy complete.'
  1345. exit
  1346.  
  1347.  
  1348.